
/* $Id: vocabol.c 8 2009-12-27 16:54:50Z calicant $ */

#include "edilana.h"
/*
 *  Chiude i file aperti dalla funzione seguente e rimuove il file "nome",
 *  che e' il file temporaneo in caso di errore, il vocabolario altrimenti.
 */
static void pulizia (FILE *p1, FILE *p2, char *nome)
{
	fclose(p1);
	fclose(p2);
	remove(nome);
}

/*
 *  Aggiunge o toglie un lemma da un vocabolario che si suppone ordinato
 *  alfabeticamente. Restituisce 0 se non ci sono stati errori (lemma da
 *  aggiungere presente, lemma da togliere assente).
 */
int InsTogliVocab (char *nomevocab, char *radice, int inserisci)
{
char	lemma[MAXSTRLEN];
int	val, numlemmi = 0;
FILE 	*puntvoc, *puntout;

	puntvoc = IOFile(nomevocab,"r");
	puntout = IOFile(TEMPFILE,"w");
	if (IOFail(puntvoc,puntout)) return -1;

	/* per confrontare con i lemmi del vocabolario */
	strcat(radice,"\n");

	while(fgets(lemma,MAXSTRLEN,puntvoc) != NULL) {
		val = strcmp(radice,lemma);
		numlemmi++;

		/* vogliamo inserire un nuovo lemma */
		if (inserisci) {
			/* ancora presto per l'inserimento */
			if (val > 0)
				fputs(lemma,puntout);
			/* errore: il lemma e' gia' nel vocabolario */
			else if (val == 0) {
				IoDico(LEMMA_PRESENTE);
				pulizia(puntvoc,puntout,TEMPFILE);
				return -1;
			}
			/* possiamo inserire al punto giusto */
			else {
				fputs(radice,puntout);
				fputs(lemma,puntout);
				break;
			}
		}
		/* vogliamo togliere un lemma presente */
		else {
			/* ricerchiamo piu' avanti */
			if (val > 0)
				fputs(lemma,puntout);
			/* errore: non c'e' il lemma da togliere */
			else if (val < 0) {
				IoDico(LEMMA_NON_PRESENTE);
				pulizia(puntvoc,puntout,TEMPFILE);
				return -1;
			}
			/* abbiamo trovato il lemma da togliere */
			else break;
		}
	} /* end while */

	/* scriviamo nel file temporaneo il resto del vocabolario */
	while(fgets(lemma,MAXSTRLEN,puntvoc) != NULL) {
		fputs(lemma,puntout);
		numlemmi++;
	}
	/* nel caso di lemma da inserire... */
	if (inserisci) {
		/* abbiamo aggiunto */
		numlemmi++;
		/* il lemma e' l'ultimo in ordine alfabetico */	
		if (val > 0) 
			fputs(radice,puntout);
	}
	/* se, invece, da togliere... */
	else numlemmi--; 

	/* stampiamo quanti lemmi ci sono ora */
	printf(" *** in \"%s\" ci sono %d lemmi\n",nomevocab,numlemmi);

	/* facciamo diventare il nostro file temporaneo vocab. corrente */
	pulizia(puntvoc,puntout,nomevocab);
	rename(TEMPFILE,nomevocab);

return 0;
}
